#include "main.h"
#include <stdio.h>
#include <string.h>
#include "tcp_demo.h"
#include "W5500_conf.h"
#include "w5500.h"
#include "socket.h"

#define  TCP_RX1_LENTH    USART1_TX_BUFF_LENGTH
#define  TCP_RX1_BUFFER  USART1_TX_BUFF

#define  TCP_RX2_LENTH    USART2_TX_BUFF_LENGTH
#define  TCP_RX2_BUFFER  USART2_TX_BUFF

uint16_t  W5500_RX_DATA_LENGTH;     //W5500内部缓冲区数据
uint32_t debug;
uint8_t listend;
uint8_t listend2;

//                                 5           30000
void wizchip_settimeout(uint16_t time1,uint16_t time2)
{
   setRCR(time1);
   setRTR(time2);
}
//setSn_KPALVTR(sn, 0x01);
//开启断开自动重新连接
void keep_alive()
{
//   wizchip_settimeout(3,10000);
//   IINCHIP_WRITE(Sn_KPALVTR(local_port),0x01);
//	 IINCHIP_WRITE(Sn_KPALVTR(local_port2),0x01);
//超时断连设置
}
uint8_t text_data;
//	 test_data=getPHYCFGR();可用于检测物理网口连接状态
// text_data=getIR();
void do_tcp_server_USART1_RX(void)
{	
  listend=getSn_SR(SOCK_USART1);
	switch(listend)											            	/*获取socket的状态*/
	{
	  case SOCK_CLOSED:													                              /*socket处于关闭状态*/
	
				 //setSn_IR(SOCK_USART1, 0xff);								          /*清除接收中断标志位*/
		     //clearIR(0xff);							          /*清除接收中断标志位*/

			socket(SOCK_USART1 ,Sn_MR_TCP,local_port,Sn_MR_ND);	        /*打开socket*/
		  //uLinkFlag = 1;
			break;     
    
		case SOCK_INIT:														                                  /*socket已初始化状态*/
			listen(SOCK_USART1);												                          /*socket建立监听*/
     
		  break;
		
		  case SOCK_ESTABLISHED:												                        /*socket处于连接建立状态*/
			if((getPHYCFGR()&0x05)==0)//物理网口断开关闭连接
			{
			   close(SOCK_USART1);
			}
			
			
			if(get_queue_use_length(&USART1_RX_queue)>0)
			{//串口缓冲区有数据
		      queue_out_tcp_dma(SOCK_USART1,&USART1_RX_queue);					 
			}
		  //if(uLinkFlag == 1){send(SOCK_USART1,(const uint8 *)Buf,sizeof("欢迎使用网络开发板: 设备已经连接")); uLinkFlag = 0;}		
			if(getSn_IR(SOCK_USART1)& Sn_IR_CON)
			{
				 setSn_IR(SOCK_USART1, Sn_IR_CON);								          /*清除接收中断标志位*/
			}
			W5500_RX_DATA_LENGTH=getSn_RX_RSR(SOCK_USART1);	/*定义len为已接收数据的长度*/
			if(W5500_RX_DATA_LENGTH>0) //如果发来数据
			{
			   	if(HAL_UART_GetState(&huart1)==HAL_UART_STATE_BUSY_TX)   //如果上一帧没发完
			    { 
			           return;  //直接退出//数据暂存在w5500缓冲区里
			    }
					if(W5500_RX_DATA_LENGTH>=TCP_RX1_LENTH)  //缓冲区数据大于内部数据
					{
							recv(SOCK_USART1,TCP_RX1_BUFFER,TCP_RX1_LENTH);		/*接收来自Client的数据*///只接受内部缓冲区长度的数据					
							HAL_UART_Transmit_DMA(&huart1,TCP_RX1_BUFFER,TCP_RX1_LENTH);
					}
					else
					{
					    recv(SOCK_USART1,TCP_RX1_BUFFER,W5500_RX_DATA_LENGTH);	                      //接受全部数据
							HAL_UART_Transmit_DMA(&huart1,TCP_RX1_BUFFER,W5500_RX_DATA_LENGTH);
					}
			}
		  break;
		
		  case SOCK_CLOSE_WAIT:												                /*socket处于等待关闭状态*/
			close(SOCK_USART1);
		  break;
			
			default:
				if((getPHYCFGR()&0x05)==0)//物理网口断开关闭连接
			  {
			     close(SOCK_USART1);
			  }
			break;
			//	socket(SOCK_USART1 ,Sn_MR_TCP,local_port,Sn_MR_ND);	        /*打开socket*/

	}
	
}

//ctlnetwork(CN_SET_TIMEOUT, (void*)&wiz_nettimeout);

void do_tcp_server_USART2_RX(void)
{	
//	IINCHIP_WRITE(Sn_KPALVTR(s),0x02);
  listend2=getSn_SR(SOCK_USART2);
	switch(listend2)											            	/*获取socket的状态*/
	{
	  case SOCK_CLOSED:													                              /*socket处于关闭状态*/
			
			socket(SOCK_USART2 ,Sn_MR_TCP,local_port2,Sn_MR_ND);	        /*打开socket*/
		  //uLinkFlag = 1;
			break;     
    
		case SOCK_INIT:														                                  /*socket已初始化状态*/
			listen(SOCK_USART2);												                          /*socket建立监听*/
     
		  break;
		
		  case SOCK_ESTABLISHED:												                        /*socket处于连接建立状态*/
			if((getPHYCFGR()&0x05)==0)//物理网口断开关闭连接
			{
			   close(SOCK_USART2);
			}
			if(get_queue_use_length(&USART2_RX_queue)>0)
			{//串口缓冲区有数据
		      queue_out_tcp_dma(SOCK_USART2,&USART2_RX_queue);					 
			}
		  //if(uLinkFlag == 1){send(SOCK_USART1,(const uint8 *)Buf,sizeof("欢迎使用网络开发板: 设备已经连接")); uLinkFlag = 0;}		
		
			if(getSn_IR(SOCK_USART2) & Sn_IR_CON)
			{
				 setSn_IR(SOCK_USART2, Sn_IR_CON);								          /*清除接收中断标志位*/
			}
			W5500_RX_DATA_LENGTH=getSn_RX_RSR(SOCK_USART2);	/*定义len为已接收数据的长度*/
			if(W5500_RX_DATA_LENGTH>0) //如果发来数据
			{
			   	if(HAL_UART_GetState(&huart2)==HAL_UART_STATE_BUSY_TX)   //如果上一帧没发完
			    { 
			           return;  //直接退出//数据暂存在w5500缓冲区里
			    }
					if(W5500_RX_DATA_LENGTH>=TCP_RX2_LENTH)  //缓冲区数据大于内部数据
					{
							recv(SOCK_USART2,TCP_RX2_BUFFER,TCP_RX2_LENTH);		/*接收来自Client的数据*///只接受内部缓冲区长度的数据					
							HAL_UART_Transmit_DMA(&huart2,TCP_RX2_BUFFER,TCP_RX2_LENTH);
					}
					else
					{
					    recv(SOCK_USART2,TCP_RX2_BUFFER,W5500_RX_DATA_LENGTH);	                      //接受全部数据
							HAL_UART_Transmit_DMA(&huart2,TCP_RX2_BUFFER,W5500_RX_DATA_LENGTH);
					}
			}
		  break;
		
		  case SOCK_CLOSE_WAIT:												                /*socket处于等待关闭状态*/
			close(SOCK_USART2);
		  break;
			
			
			default:
				if((getPHYCFGR()&0x05)==0)//物理网口断开关闭连接
			  {
			    close(SOCK_USART2);
			  }
			break;
				// close(SOCK_USART2);
			   //socket(SOCK_USART2 ,Sn_MR_TCP,local_port2,Sn_MR_ND);	 /*打开socket*/  
			  

	}
	
}


	

